home *** CD-ROM | disk | FTP | other *** search
Text File | 1996-09-03 | 88.1 KB | 1,876 lines |
- ææææ GRAPH Interactive Help ææææ
- %%102
-
- FILOSOFIA DE GRAPH
-
- La filosofia que adopta GRAPH és una de les més sencilles que es podría
- tenir. GRAPH funciona per handles, es a dir, cuan tu crides a alguna fun-
- ció, el sistema et tornarà un valor amb el que podrás referirte després a
- una pantalla virtual, una paleta, etc.
- Per exemple, des de l'ensamblador podriem escriure:
-
- CALL CreaVirtual
- MOV [HandlePV], AL
-
- i després referirte a aquesta pantalla virtual amb aquest valor que hem
- col·locat en la variable "HandlePV":
-
- MOV AL, [HandlePV]
- MOV AH, 0
- CALL CopiaPantalla
-
- Així de senzill i així de potent. En altrés llenguatges com en C podriem
- fer el següent:
-
- byte handle1;
- handle1=CreaVirtual();
- CopiaPantalla(handle1, 0);
-
- Amb aquest sistema podrem olvidar-nos de les biblioteques gràfiques que
- ens tornen segments i offsets que poden fer que ens marejem en projectes
- mitjans o llargs.
- Altre punt important a tenir en compte al treballar amb GRAPH són les
- funcions del tipus "fast" que ens permeten escollir entre una funció un
- poc més ràpida o un altra amb més control d'errors. Aquestes funcions es
- criden col·locant davant una `f∩. Per exemple, la funció "PonPixel" és
- fast i podrem, doncs, cridar-la d'aquestes dos maneres:
-
- PonPixel(x, y, 16, 0);
- fPonPixel(x, y, 16, 0);
-
- la primera ens donarà més informació d'errors mentre la segona serà un poc
- més ràpida, però amb menys errors. Tambè es diferencien en que la primera,
- en les funcions en que siga possible, s'aplicarà les tècniques de clipping
- o retall.
- La estructuració de GRAPH (i açó és nou en aquesta versió) fa que en
- compte de cridar a les funcions d'una llibreria de la que no tens (o no
- deuries tindre) el llistat font, crides a una macro (alternativa 1 en
- assembler) o a un procediment (alternativa 2 en assembler i resta de llen-
- guatges) que es troba en un fitxer d'inclusió completament modificable.
- I tot açó auxiliat per un sistema de tractament i detecció d'errors prou
- potent (mira el menú «El sistema d'errors»).$$
- %%202
-
- FILOSOFIA DE GRAPH
-
- La filosofía que adopta GRAPH es una de las más sencillas que se podria
- coger. GRAPH funciona por handles, es decir, cuando tu llamas a alguna fun-
- ción, el sistema te devuelve un valor con el que podrás referirte despues a
- una pantalla virtual, una paleta, etc.
- Por ejemplo, desde el ensamblador podrias escribir:
-
- CALL CreaVirtual
- MOV [HandlePV], AL
-
- i despues referirte a esta pantalla virtual con el valor que has colocado
- en la variable "HandlePV":
-
- MOV AL, [HandlePV]
- MOV AH, 0
- CALL CopiaPantalla
-
- Así de sencillo y así de potente. En otros lenguajes como en C podriamos
- escribir lo siguiente:
-
- byte handle1;
- handle1=CreaVirtual();
- CopiaPantalla(handle1, 0);
-
- Con este sistema podremos olvidarnos de las bibliotecas gráficas que
- nos devuelven segmentes y offsets que pueden volvernos locos en grandes
- proyectos.
- Otro punto importante a tener en cuenta cuando trabajamos con GRAPH són
- las funciones del tipo "fast" que nos permiten elegir entre una función un
- poco más rápida o otra con más control d'errors. Estas funciones se llaman
- anteponiendo una `f∩. Por ejemplo, la función "PonPixel" es fast, podremos
- llamarla de estas dos maneras:
-
- PonPixel(x, y, 16, 0);
- fPonPixel(x, y, 16, 0);
-
- la primera nos dará más información sobre errores, mientras la segunda será
- un poco más rápida, pero con menos errores. Tambien se diferencian en que
- la primera, con las funciones que lo permitan, se aplicará las técnicas de
- clipping o recorte.
- La estructuración de GRAPH (i esto es nuevo esta versión) hace que en
- lugar de llamar a las funciones de una libreria de la que no tienes (o no
- deberias tener) el código fuente, llames a una macro (alternativa 1 en
- assembler) o a un procedimiento (alternativa 2 en assembler y el resto de
- lenguajes) que se encuentran en un fichero de inclusión completamente modi-
- ficable. I todo esto ayudado por un sistema de tractamiento y detección de
- errores bastante potente (mira el menú «El sistema de errores»).$$
- %%302
- I'm sorry :-( Information not available in english.
- Write me a post card to receive some help. Thank you :-)$$
- %%103
- ELS MODES GRAFICS
-
- El primer que hauria de dir-se dels modes gràfics és que són el que
- defineix cuants pixels i cuants colors podem tenir al mateix temps en la
- pantalla i un altre aspecte més difícil de veure però molt important: les
- planes gràfiques.
- En aquesta segona versió de GRAPH hi han 3 modes gràfics que s'elegeixen
- al (re)iniciar el sistema GRAPH (mitjançant "InicGRAPH" o "ResetGRAPH").
- En 2 d'aquestos modes podem obtenir el doble de resolució vertical amb la
- funció "DoblaLineas" (mira el menú «Funcions avançades»).
- Els modes gràfics que podem cridar són aquestos:
-
- 1 --> 320x200x256c i 1 plana. --> Nom: Mode 13h
- 2 --> 320x200x256c i 4 planes. --> Nom: Mode 13X
- 3 --> 320x240x256c i 3 planes. --> Nom: Mode X
-
- Cada mode gràfic presenta les seues ventajes i els seus inconvenients.
- El primer és el més ràpid per a la majoría d'operacions, però presenta el
- serios inconvenient de que nomes té una plana de memoria i, per aixó,
- haurem de demanar totes les planes que ens calguen perdent memoria RAM.
- El segón mode és més lent que el 13h, però, en ell ja disposem de planes
- suficients per a la majoria d'aplicacions que fem. També té la ventaja de
- que fer un scroll en mode 13X és infinitament més senzill que fer-ho en el
- 13h (mira el menú «Funcions avançades»).
- El darrer mode és mereix una explicació a banda. El mode X és un mode
- molt conegut pels programadors de jocs (especialment en 3D) i de demos ja
- que permet que els pixels siguen cuadrats i, per aixó, cuan dibuixem un
- cercle serà un cercle i no una el·lipse o un cuadrat no serà un rectangle.
- Aquest mode el va descobrir Michael Abrash i al no ser un mode estandard de
- la VGA es sol dir que pot causar problemes del tipus de incompatibilitats.
- En la pràctica, però, no tindrem cap problema en emprar aquestes funcions.
- El mode X té les mateixes ventajes i inconvenients que el 13X a més de la
- ventaja dels pixels cuadrats.$$
- %%203
- LOS MODOS GRAFICOS
-
- Lo primero que deberia decirse de los modos gráficos es que són lo que
- define cuantos pixels y cuantos colores pueden tenerse al mismo tiempo en
- la pantalla y el número de páginas de video que existen.
- En esta segunda versión de GRAPH hay 3 modos gráficos que se eligen al
- (re)iniciar el sistema GRAPH (mediante "InicGRAPH" o "ResetGRAPH"). En 2 de
- estos modos podemos obtener el doble de resolución vertical con la función
- "DoblaLineas" (mira el menú «Funciones avanzadas»).
- Los modos gráficos que podemos llamar son estos:
-
- 1 --> 320x200x256c i 1 pag. --> Nom: Mode 13h
- 2 --> 320x200x256c i 4 pag. --> Nom: Mode 13X
- 3 --> 320x240x256c i 3 pag. --> Nom: Mode X
-
- Cada modo gráfico tiene sus ventajas y sus inconvenientes. El primero es
- el más rápido para la mayoría de operaciones, pero presenta el gran incon-
- veniente de que sólo tiene una página de memoria y, por eso, tendremos que
- pedir todas las páginas que necesitemos de RAM. El segundo modo es más lento
- que el 13h, pero en el ya disponemos de páginas suficientes para la mayoria
- de aplicaciones. Tambien tiene la ventaja de que hacer un scroll en modo 13X
- es infinitamente más sencillo que en el modo 13h (mira el menú «Funciones
- avanzadas»).
- El último modo merece una explicación a parte. El mode X és un modo muy
- conocido por los programadores de juegos (especialmente en 3D) y de demos
- ya que permite que los pixels sean cuadrados y, por eso, cuando dibujemos
- un cículo será un círculo y no una elipse o un cuadrado no será un rectan-
- gulo. Este modo lo descubrio Michael Abrash y como no es un modo estandard
- de la VGA se suele decir que puede causar problemas de incompatibilidad.
- En la práctica no tendremos ningún problema al usar estas funciones. El
- mode X tiene las mismas ventajas e inconvenientes que el 13X además de la
- ventaja de los pixels cuadrados.$$
- %%303
- I'm sorry :-( Information not available in english.
- Write me a post card to receive some help. Thank you :-)$$
- %%104
- ARXIUS MAD
-
- MAD és l'extensió que adopten els arxius amb el format MADff que són les
- sigles angleses de «Multi-Archive Designation File Format» i que ens van a
- servir per a empaquetar o magatzemar tots els fitxers individuals que tinga
- un programa, joc o demo en un únic fitxer més gran.
- Açó ens serà de molta utilitat per a millorar l'aspecte global del nostre
- programa per que, ¿a qui li agrada fer un "dir" en un directori i trobar-se
- amb 40 fitxers? Queda molt poc elegant i si es pot evitar hem d'evitar-ho.
- La pregunta és ara ¿perque MADff i no altre tipus? Podria haver emprat
- el format WAD (com el DOOM o l'HERETIC) o algún format d'aquestos que fun-
- cionen per CHUNKS (com el dels fitxers WAV o PNG), però, en aquestos for-
- mats hi ha un gran problema que és el de les licencies, es a dir, que hi ha
- que pagar (o al menys obtenir un permís) per a emprar-los. Per aixó vaig
- escollir el format MADff (a banda de que és molt més senzill que els altres
- formats que conec) i per aixó vaig programar un petita aplicació que ens
- permetrà fer un MAD a partir dels fitxers individuals: MAD-MAKER. Un altra
- raó de l'elecció del format MAD és que s'adapta molt bé a la filosofia de
- GRAPH, a la utilització mitjançant handles (encara que en la versió 2.0 no
- s'ha implementat aquesta possibilitat).
- No explicaré ací altra vegada el funcionament de MAD-MAKER que és molt
- senzill i té un arxiu de text explicant-ho, a més a més dels fonts, però
- sí voldría cridar l'atenció de tots els coders que vulguen col·laborar
- per a que intenten millorar-lo i me'l envien per a distribuir-lo en la
- següent versió. El format MADff podeu consultar-lo en el fitxer anomenat
- "MADFF.TXT" i que està en el mateix directori que el MAD-MAKER.$$
- %%204
- ARCHIVOS MAD
-
- MAD es la extensión que adoptan los archivos con el formato MADff que son
- las siglas inglesas de «Multi-Archive Designation File Format» y que nos van
- a servir para empaquetar o almazenar todos los ficheros individuales que
- tenga un programa, juego o demo en un único fichero más grande.
- Esto nos será de mucha utilidad para mejorar el aspecto global de nuestro
- programa por que, ¿a quien le gusta hacer un "dir" en un directorio y encon-
- trarse con 40 ficheros? Queda muy poco elegante y si se puede evitar tenemos
- que hacerlo.
- La pregunta que queda es ¿porque MADff y no otro tipo? Podri haber usado
- el formato WAD (como el DOOM o el HERETIC) o algún formato de estos que
- funcionan por CHUNKS (como el de los ficheros WAV o PNG), pero estos for-
- matos tienen el gran problema de las licencias, es decir, que hay que pagar
- (o obtener un permiso) para usarlos. Por eso decidí elegir el formato MADff
- (a parte de que es mucho más sencillo que el resto de formatos que conozco)
- i por eso programé una pequeña aplicación que nos permitirá hacer un MAD
- a partir de ficheros individuales: MAD-MAKER. Otra razón de la elección del
- formato MAD es que se adapta muy bien a la filosofía de GRAPH, a la utili-
- zación mediante handles (aunque en esta versión 2.0 no se implemente esta
- posibilidad).
- No explicaré aquí otra vez el funcionamento de MAD-MAKER que es muy
- sencillo y tiene un archivo de texto explicandolo, además del código fuente,
- pero sí querría llamar la atención de todos los coders que quieran colaborar
- para que intenten mejorarlo y me lo envien para distribuirlo en la siguiente
- versión. El formato MADff lo podeis consultar en el fichero llamado
- "MADFF.TXT" y que está en el mismo directorio que el MAD-MAKER.$$
- %%304
- I'm sorry :-( Information not available in english.
- Write me a post card to receive some help. Thank you :-)$$
- %%105
- EL MODE FLAT. DE LA TEORIA A LA PRACTICA.
-
- El mode flat és un clónic entre el mode real i el mode protegit del
- procesador (bé, no és un clónic, però es pot dir així 8-). El que ens
- interesa és que es tracta de una nova forma de treballar (per al proce-
- sador) en la cual tenim acces a 4Gb de memoria RAM.
- Aixó és així en teoria al menys, per que si demanem 1 sol giga, ens van
- a enviar a... Vaja, que en compte de 4Gb tindrem la memoria que el usuari
- dispose fisicament menys la memoria ocupada (que pot saber-se fent un "mem"
- o emprant la funció "MaximaXMS").
- No ens hem de confundir, no és el mateix la memoria XMS que nosaltres
- demanarem i la que ens proporciona el driver EMM386 (en realitat la memoria
- és la mateixa, el que canvia són les formes). El que anomenarem memoria
- XMS i que ens proporcionaran les funcions del mode flat és tota la memoria
- per dalt del primer mega.
- El mode flat s'ha d'iniciar, però no és necesari que és finalitze per que
- per als programes normals no hi ha cap canvi. La manera de treballar del
- programador tampoc hauria de canviar (o al menys no necessariament). Téc-
- nicament el que fa GRAPH per a iniciar el mode flat és entrar en mode
- protegit canviar el selector de segment per a que aquest segment tinga una
- llargaría de 4Gb (o tota la memoria disponible) i tornar al mode real.
- Una volta iniciat el mode flat podrem olvidar-se en certa manera de les
- limitacions que imposen els segments de 64Kb i la barrera (psicológica) del
- primer Mb. Podrem fer des de l'assembler açó, per exemple:
-
- XOR AX, AX
- MOV DS, AX
- XOR EDI, EDI
- MOV DL, 90h
- MOV ECX, 16*1024*1024
- Bucle:
- MOV DS:[EDI], DL
- DEC ECX
- JNZ Bucle
-
- Amb el que plenariem els primers 16Mb (si l'usuari els tenira) amb el valor
- 90h (un NOP) i com no ens trobariem en mode protegit, tan sols estariem en
- el mode flat, cuan el programa ens sobre-escribira (per que ens trobariem
- al primer mega), ens quedariem penjats o s'ejecutarien les instruccions de
- darrere del bucle.
- Una cosa que s'ha de tenir en compte sempre que vulgam accedir a la memo-
- ria superior és que hem de tenir habilitada la linia A20 i si no es penjarà
- o escriurem on no es deu d'escriure (per les lleis de Murphie). Però, com
- es pot habilitar aixó? Doncs jo ho faig amb una rutineta interna de GRAPH
- cada volta que es va a copiar de o des de la memoria alta. Has de saber que
- si es col·loca la linia aquesta en ON o en OFF, ella sola no es canviarà,
- per aixó es suposa que una volta has inicialitzat el mode flat (a l'hora
- que GRAPH mitjançant un bit en les flags) i has cridat a una funció que
- cópie de o des de memoria alta, la linia quedarà habilitada per sempre.
- Açó és, com sempre, pura teoria, però. Per inexplicables raons, el driver
- HIMEM la majoria de voltes que es cridat deshabilita la A20. Si tens
- problemes escribint o llegint de memoria alta, ja saps el que passa i ja
- saps la solució (una postal).
- Després de l'anterior paràgraf podries pensar "Desinstal·lem el driver
- aquest i problema solucionat", però si ho feres obtindries el error 11h
- i no podries entrar en GRAPH. Sí, l'error 11h és «HIMEM no encontrado» i
- és absolutament necessari per a GRAPH que HIMEM estigui en memoria si
- es va a usar el mode flat. No podem viure amb ell, però tampoc sense ell;
- quin dilema!
-
- US DEL MODE FLAT.
-
- Per a emprar el mode flat de manera "politicament correcta" amb GRAPH no
- hauries de modificar directament la memoria alta (encara que eres lliure
- de fer el que et vinga en gana per que estás en DOS i no un d'aquestos
- sistemes operatius manipuladors i controladors).
- Et recomane que sols faces servir les funcions "GuardaFlat" i "CargaFlat"
- que serveixen per a copiar a memoria alta i des de memoria alta respectiva-
- ment. Tots els tipus de dades que empra GRAPH v2.0 poden ser copiades amb
- aquestes funcions respectant la filosofia de GRAPH que diu que s'han de
- emprar handles per a tot.
- Però si vols eixir-te de la norma i anar, literalment, "a la aventura",
- podrás emprar les funcions "PideXMS", "LiberaXMS", etc. Fes el que millor
- et parega, però recorda que jo no em faig responsable de les destrosses
- que puguera causar GRAPH.$$
- %%205
- EL MODO FLAT. DE LA TEORIA A LA PRACTICA.
-
- El modo flat es un clónico entre el modo real y el modo protegido del
- procesador (vale, no es un clónico, pero se puede decir así 8-). Lo que nos
- interesa es que se trata de una nueva forma de trabajar (para el procesador)
- en la cual tenemos acceso a 4Gb de memoria RAM.
- Eso es así en teoria el menos, por que si pedimos aunque sólo sea 1 giga,
- nos van a enviar a... Vamos, que en lugar de tener 4Gb, tenemos la memoria
- que el usuario disponga físicamente menos la memoria ocupada (que puede
- averiguarse con un "mem" o con la función `MaximaXMS∩).
- No tenemos que confundirnos, no es lo mismo la memoria XMS que nosotros
- pedimos y la que nos proporciona el driver EMM386 (aunque la memoria es la
- misma, lo que cambia son las formas). Lo que llamaremos memoria XMS y que
- nos proporcionaran las funciones del modo flat es toda la memoria por
- encima de 1 mega.
- El modo flat se ha de iniciar, peroa no es necesario que se finalize por
- que para los programas normales no hay ningún cambio. La forma de trabajar
- del programador tampoco tendria que cambiar (o al menos no necesariamente).
- Técnicamente lo que hace GRAPH para iniciar el modo flat es entrar en modo
- protegido, cambiar el selector de segmento para que éste segmento tenga una
- longitud de 4Gb y vuelve al modo real.
- Una vez iniciado el modo flat podremos olvidarnos en cierta manera de las
- limitaciones que imponen los segmentos de 64Kb y la barrera (psicológica)
- del primer Mb. Podremos hacer desde el assembler esto, por ejemplo:
-
- XOR AX, AX
- MOV DS, AX
- XOR EDI, EDI
- MOV DL, 90h
- MOV ECX, 16*1024*1024
- Bucle:
- MOV DS:[EDI], DL
- DEC ECX
- JNZ Bucle
-
- Con lo que llenariamos los primeros 16Mb (si el usuario los tuviera) con el
- valor 90h (un NOP) y como no estariamos en mode protegido cuando el programa
- nos sobre-escribiera (por que nos encontrariamos en el primer mega), nos
- quedariamos colgados o se ejecutarian las instrucciones de detras del bucle.
- Una cosa que se ha de tener en cuenta siempre que queramos acceder a la
- memoria superior es que tenemos que tener habilitada la linea A20 y si no
- se colgarà o escribiremos donde no se debe escribir (por las leyes de
- Murphie). Pero, ¿como se puede habilitar eso? Pues yo lo hago con una ruti-
- nita interna de GRAPH cada vez que se va a copiar de o desde la memoria alta.
- Has de saber que si se coloca la linea esa en ON o en OFF, ella sola no se
- cambiará, por eso se supone que una vez has inicializado el modo flat (a
- la vez que GRAPH mediante un bit en las flags) y has llamado a una función
- que cópie de o desde memoria alta, la linea quedará habilitada para siempre.
- Esto és, como siempre, pura teoria. Por inexplicables razones, el driver
- HIMEM la mayoria de veces que se llama deshabilita la A20. Si tienes
- problemas escribiendo o leyendo de memoria alta, ya sabes que pasa y ya
- sabes la solución (una postal).
- Despues del anterior párrafo podrias pensar "Desinstalamos el driver
- ese y problema solucionado", pero si lo hicieras obtendrias el error 11h
- y no podrias entrar en GRAPH. Sí, el error 11h es «HIMEM no encontrado» y
- es absolutamente necesario para GRAPH que el HIMEM esté en memoria si es
- que se va a usar el modo flat. No podemos vivir con él, pero tampoco sin
- él; ¡Que dilema!
-
- USO DEL MODO FLAT.
-
- Para usar el modo flat de manera "politicamente correcta" con GRAPH no
- tendrias que modificar directamente la memoria alta (aunque eres libre
- de hacer lo que te de la gana por que estás en DOS y no uno de esos
- sistemas operativos manipuladores).
- Te recomiendo que sólo uses las funciones "GuardaFlat" y "CargaFlat" que
- sirven para copiar a y desde memoria alta. Todos los tipos de datos que usa
- GRAPH v2.0 pueden ser copiadas con estas funciones respetando la filosofía
- de GRAPH que dice que se han de usar handles.
- Pero si quieres salirte de la norma y ir, literalmente, "a la aventura",
- podrás usar las funciones "PideXMS", "LiberaXMS", etc. Haz lo que te parez-
- ca, pero recuerda que yo no me hago cargo de los posibles destrozos que
- pueda causar GRAPH.$$
- %%305
- I'm sorry :-( Information not available in english.
- Write me a post card to receive some help. Thank you :-)$$
- %%106
- ELS MISSATGES D'ERROR
-
- A continuació trobaràs la llista de tots els missatges d'error que pot
- produir GRAPH v2.0 i una descripció de que són.
-
- 00. Fallo General
- Aquest error pot apareixer en una gran cuantitat de funcions. Normalment,
- es pot solucionar canviant els paràmetres d'alguna funció, es a dir, és
- un error provocat pel programador al introduir valors incorrectes (encara
- que pot produir-se en altres circumstàcies).
-
- 01. No quedan handles libres.
- Aquest error significa "No hi ha handles lliures" i pot apareixer en les
- funcions que tornen un handle. El que passa és que no hi han suficients
- handles lliures com per a magatzemar un altre més. Per exemple, si tenim
- 5 handles de PV i hem demanat els 5, cuan cridem a "CreaVirtual" obtindrem
- un error.
-
- 02. Frame no existente.
- Error que produeixen les funcions (f)PonFrameAnima i que es produeix cuan
- volem que es dibuixe un frame o image que no existeix.
-
- 03. No hay suficiente memoria libre.
- Significa "No hi ha suficient memoria lliure" i apareix cuan la memoria
- convencional o memoria baixa es massa petita per a la PV, l'sprite, etc.
- que li estem demanat. Es pot solucionar amb la memoria alta (mode flat) o
- lliberant zones de memoria.
-
- 04. Intento de liberar bloque no reservado.
- Significa "Intent de lliberar bloc no reservat". Pot apareixer cuan
- cridem a les funcions `DestXXXXX∩ o amb `VaciaMEM∩ i sol deures a que
- intentem lliberar una zona de memoria que no haviem demanat.
-
- 05. Bloque no válido.
- Aquest error el podem trobar a tot arreu i és difícil dir com solucio-
- nar-lo. Revisa el programa que l'ha produit.
-
- 06. Sprites demasiado grandes.
- Una limitació del procesador en mode real és que els segments, com a
- màxim, poden tenir 64Kb. Si es passa aquesta barrera en el tamany que pot
- ocupar un sprite, es produeix aquest error. Fes sprites més petits.
-
- 07. Error en el acceso a disco.
- Es tracta d'un error comú que apareix cuan es produeix un error de disc.
- Revisa el programa que produeix l'error.
-
- 08. Intento de eliminación VGA.
- Aquest error es produeix únicament cuan cridem a la funció `DestVirtual∩
- per a destruir la PV nº0 que es la assignada a la VGA.
-
- 09. Coordenadas de pantalla incorrectas.
- Es produeix en les funcions que no accepten clipping. Hi ha que tenir en
- compte les màximes coordenades (i les mínimes) que poden acceptar les
- diferent funcions.
-
- 0A. Archivo gráfico no válido.
- Es produeix cuan un fitxer gràfic o no té un error en la capçalera o
- simplement no és el que es supossa que deuria ser. Per exemple, cuan
- cridem a `PlayFLI∩ passant-li la direcció de un fitxer PCX.
-
- 0B. Error básico en fuente.
- Aquest error sols es produeix cuan treballem en fonts i pot ser causat
- per qualssevol tipus d'error amb una font.
-
- 0C. Error en la introducción de datos.
- Aquest error es produeix en la introducció de paràmetres a una funció.
- Té algunes similituds amb l'error nº0.
-
- 0D. Desbordamiento.
- Es produeix pel típic desbordament de registre en ensamblador. Pot ser
- causat per una erronea introducció de dades.
-
- 0E. Función no disponible en este modo.
- Hi han funcions com `Flip∩ que en determinats modes gràfics no poden ser
- usades. Per exemple `Flip∩ no té cap utilitat en els modes no planars.
-
- 0F. No existe página de visualización.
- Cuan s'intenta canviar a una plana de VRAM que no existeix es produeix
- aquest error.
-
- 10. Nos encontramos en modo V86.
- El mode flat sols pot funcionar si ens trobem en el sistema lliure de
- controladors de memoria XMS. Per a que deixe de donar aquest error,
- desinstal·la els drivers del tipus EMM386, QUEM, etc.
-
- 11. Controlador HIMEM no encontrado.
- El mode flat necessita tenir instal·lat el controlador HIMEM. Instal·la'l
- per a que desaparega aquest error.
-
- 12. No hay suficiente memoria superior.
- Es tracta de l'error homòleg del nº3 en memoria superior. Per a solucio-
- nar-lo llibera memoria superior (amb `LiberaXMS∩ o `CargaFlat∩).
-
- 13. Procesador 80386 o superior no encontrado.
- Aquest error apareix cuan no es pot detectar un procesador 80386+ durant
- el procés d'initcialització (funció `InicGRAPH∩).
-
- A part de tots aquestos errors pot apareixer un altre anomenat "Error
- general del sistema de errores" ("Error general del sistema d'errors")
- que apareix cuan un error no identificat (major del 13h) s'intenta tractar
- amb `TrataError∩.$$
- %%206
- LOS MENSAGES DE ERROR
-
- A continuación encontrarás la lista de todos los mensages de error que
- puede producir GRAPH v2.0 y una descripción de que son.
-
- 00. Fallo General
- Este error puede aparecer en una gran cantidad de funciones. Normalmente,
- se puede solucionar cambiando los parámetros de alguna función, es decir,
- es un error provocado por el programador al introducir valores incorrectos
- (aunque puede producirse en otras circunstacias).
-
- 01. No quedan handles libres.
- Este error puede aparecer en las funciones que devuelven un handle. Lo que
- pasa es que no hay suficientes handles libres como para almacenar otro más.
- Por ejemplo, si tenemos 5 handles de PV y hemos pedido los 5, cuando llame-
- mos a "CreaVirtual" obtendremos un error.
-
- 02. Frame no existente.
- Error que producen las funciones (f)PonFrameAnima y que se produce cuando
- queremos que se dibuje un frame o imagen que no existe.
-
- 03. No hay suficiente memoria libre.
- Aparece cuando la memoria convencional o memoria baja es demasiado pequeña
- para la PV, el sprite, etc. que le estamos pidiendo. Se puede solucionar
- con la memoria alta (modo flat) o liberando zonas de memoria.
-
- 04. Intento de liberar bloque no reservado.
- Puede aparecer cuando llamamos a las funciones `DestXXXXX∩ o con `VaciaMEM∩
- y suele deberse a que intentemos liberar una zona de memoria que no habia-
- mos pedido.
-
- 05. Bloque no válido.
- Este error lo podemos encontrar por cualquier sítio y es difícil decir
- como solucionarlo. Revisa el programa que lo ha producido.
-
- 06. Sprites demasiado grandes.
- Una limitación del procesador en modo real es que los segmentos, como
- máximo, pueden tener 64Kb. Si se pasa esta barrera en el tamaño que puede
- ocupar un sprite, se produce este error. Haz sprites más pequeños.
-
- 07. Error en el acceso a disco.
- Se trata de un error común que aparece cuando se produce un error de
- disco. Revisa el programa que produce el error.
-
- 08. Intento de eliminación VGA.
- Este error se produce únicamente cuando llamamos a la función
- `DestVirtual∩ para destruir la PV nº0 que es la asignada a la VGA.
-
- 09. Coordenadas de pantalla incorrectas.
- Se produce en las funciones que no aceptan clipping. Hay que tener en
- cuenta las máximas coordenadas (y las mínimas) que pueden aceptar las
- diferentes funciones.
-
- 0A. Archivo gráfico no válido.
- Se produce cuando un fichero gráfico o tiene un error en la cabecera
- o simplemente no es lo que se supone que deberia ser. Por ejemplo, cuando
- llamemos a `PlayFLI∩ pasandole la dirección de un fichero PCX.
-
- 0B. Error básico en fuente.
- Este error sólo se produce cuando trabajamos con fuentes y puede ser
- causado por cualquier tipo de error con una fuente.
-
- 0C. Error en la introducción de datos.
- Este error se produce en la introducción de parámetros a una función.
- Tiene algunas similitudes con el error nº0.
-
- 0D. Desbordamiento.
- Se produce por el típico desbordamiento de registro en ensamblador. Puede
- ser causado por una erronea introducción de datos.
-
- 0E. Función no disponible en este modo.
- Hay funciones como `Flip∩ que en determinados modos gráficos no pueden
- ser usadas. Por ejemplo `Flip∩ no tiene ninguna utilidad en los modos no
- planares.
-
- 0F. No existe página de visualización.
- Cuando se intenta cambiar a una página de VRAM que no existen se produce
- este error.
-
- 10. Nos encontramos en modo V86.
- El modo flat sólo puede funcionar si nos encontramos con el sistema libre
- de controladores de memoria XMS. Para que deje de dar este error, desins-
- tala los drivers del tipo EMM386, QUEM, etc.
-
- 11. Controlador HIMEM no encontrado.
- El modo flat necessita tener instalado el controlador HIMEM. Instalalo
- para que desaparezca este error.
-
- 12. No hay suficiente memoria superior.
- Se trata del error homólogo del nº3 en memoria superior. Para solucionarlo
- libera memoria superior (con `LiberaXMS∩ o `CargaFlat∩).
-
- 13. Procesador 80386 o superior no encontrado.
- Este error aparece cuando no se puede detectar un procesador 80386+
- durante el proceso de inicialización (función `InicGRAPH∩).
-
- A parte de todos estos errores puede aparecer otro llamado "Error general
- del sistema de errores" que aparece cuando un error no identificado (mayor
- del 13h) se intenta tratar con `TrataError∩.$$
- %%306
- I'm sorry :-( Information not available in english.
- Write me a post card to receive some help. Thank you :-)$$
- %%107
- UTILITATS ADICIONALS
-
- Junt a GRAPH v2.0 apareixen uns cuants programes d'utilitat que t'aju-
- daran a traure-li més partit a GRAPH. Aquestes s'expliquen totes en els
- fitxers de text que es poden trobar en el mateix directori que el programa.
- La major part d'elles tenen el font per a que l'adeques al teu gust o a les
- teues necessitats.$$
- %%207
- UTILIDADES ADICIONALES
-
- Junto a GRAPH v2.0 aparecen unos cuantos programas de utilidad que te ayu-
- daran a sacarle más partido a GRAPH. Estos se explican todos en los ficheros
- de texto que se pueden encontrar en el mismo directorio que el programa. La
- mayor parte de ellas tienen el código fuente para que los adecues a tu gusto
- o a tus necesidades.$$
- %%307
- I'm sorry :-( Information not available in english.
- Write me a post card to receive some help. Thank you :-)$$
- %%108
- EL SISTEMA DE TRACTAMENT D'ERRORS
-
- Un subsitema fonamental en GRAPH és el de tractament d'errors. En la
- llista de funcions trobaràs algunes que diu "Sí" en l'apartat de STDERR.
- Aquestes són les funcions que funcionen amb el sistema de tractament
- d'errors de GRAPH, les altres no produeixen errors (encara que si que
- tinguen).
- Per a detectar un error després de cridar a una funció es pot fer el
- següent:
-
- ■ Cridar a la funció.
- ■ SI ENS TROBEM EN ASSEMBLER: Comprobar el valor del carry flag.
- ■ Comprobar el valor de la variable pública "LERROR".
- ■ Si "LERROR" té en el byte menys significatiu un 0FFh hi ha error.
- ■ El error és el que indica el byte més significatiu.
-
- Com val més una image que mil paraules, aquí va un exemple en assembler
- i altre en C:
-
- .....
- MOV AL, 0
- DestVirtual
- JNC @@NoHayError
- MOV AX, LERROR
- INC AL
- JNZ @@NoHayError
- MOV AL, AH
- MOV AH, 4Ch
- INT 21h
- @@NoHayError:
- .....
-
- .....
- DestVirtual(0);
- if((LERROR & 0xFF)==0xFF)
- exit(LERROR>>8);
- .....
-
- Aquestos dos exemples fan el mateix, criden a la funció `DestVirtual∩
- amb un paràmetre incorrecte (s'intenta destruir la VGA) i després es
- comproba si hi ha error. En cas afirmatiu es surt al DOS amb el ERRORLEVEL
- del error produit en GRAPH i si no hi ha error es continua.
- És necessari remarcar que des de l'assembler tenim la carry flag que ens
- indica si hi ha o no error, però des de C o altres llenguatges hem de mirar
- solament la variable LERROR, per aixó, és important borrarla (fer que valga
- 0) després de cada error (sempre que no surtim al DOS amb cada error).
-
- LA FUNCIα "TRATAERROR"
-
- Per a automatizar el procés de tractament d'errors existeix una funció
- anomenada `TrataError∩ que si hi ha error ho escriu en la pantalla i a la
- nostra elecció surt o no al DOS. Per a decidir si surt o no al DOS ho hem
- de fer saber cuan cridem a la funció `InicGRAPH∩ o `ResetGRAPH∩.
- La funció `TrataError∩ ha d'apareixer seguidament de la funció que volem
- saber si ha produit un error i si no és així pot donar resultats extranys.
- Queden més cosses per dir del subsistema de tractament d'errors, però no
- se m'ocurreixen ara :-O $$
- %%208
- EL SISTEMA DE TRATAMIENTO DE ERRORES
-
- Un subsistema fundamental en GRAPH es el de tratamiento de errores. En la
- lista de funciones encontrarás algunas que dice "Sí" en el apartado de
- STDERR. Estas son las funciones que funcionan con el sistema de tratamiento
- de errores de GRAPH, las otras no producen errores (aunque si que tengan).
- Para detectar un error despues de llamar a una función se puede hacer lo
- siguiente:
-
- ■ Llamar a la función.
- ■ SI ESTAMOS EN ASSEMBLER: Comprobar el valor del carry flag.
- ■ Comprobar el valor de la variable pública "LERROR".
- ■ Si "LERROR" tiene en el byte menos significativo un 0FFh hay error.
- ■ El error es el que indica el byte más significativo.
-
- Como vale más una imagen que mil palabras, ahí va un ejemplo en assembler
- i otro en C:
-
- .....
- MOV AL, 0
- DestVirtual
- JNC @@NoHayError
- MOV AX, LERROR
- INC AL
- JNZ @@NoHayError
- MOV AL, AH
- MOV AH, 4Ch
- INT 21h
- @@NoHayError:
- .....
-
- .....
- DestVirtual(0);
- if((LERROR & 0xFF)==0xFF)
- exit(LERROR>>8);
- .....
-
- Estos dos ejemplos hacen lo mismo, llaman a la función `DestVirtual∩ con
- un parámetro incorrecto (se intenta destruir la VGA) y despues se comprueba
- si hay error. En caso afirmativo se sale al DOS con el ERRORLEVEL del error
- producido en GRAPH y si no hay error se continua.
- Es necesario remarcar que desde assembler tenemos la carry flag que nos
- indica si hay o no error, pero desde C u otros lenguajes hemos de mirar
- solament la variable LERROR, por eso, es importante borrarla (hacer que
- valga 0) despues de cada error (siempre que no salgamos al DOS con cada
- error).
-
- LA FUNCIαN "TRATAERROR"
-
- Para automatizar el proceso de tratamiento de errores existe una función
- llamada `TrataError∩ que si hay error lo escribe en la pantalla y según
- elijamos sale o no al DOS. Para decidir si sale o no al DOS se lo tenemos
- que hacer saber cuando llamemos a la función `InicGRAPH∩ o `ResetGRAPH∩.
- La función `TrataError∩ ha de aparecer seguidamente de la función que
- queremos saber si ha producido un error y si no es así puede dar resultados
- extraños. Quedan más cosas por decir del subsistema de tratamiento de erro-
- res, pero no se me ocurren ahora :-O $$
- %%308
- I'm sorry :-( Information not available in english.
- Write me a post card to receive some help. Thank you :-)$$
- %%109
- CONSIDERACIONS ENTRE LLENGUATGES
-
- GRAPH en la nova versió (la 2.0) soporta, a més a més de l'ensamblador,
- alguns altres llenguatges. Per imposibilitats tècniques i físiques no tots
- els compiladors soporten GRAPH. Així, per exemple, en el llenguatge C,
- GRAPH ha estat disenyada mirart el Turbo C++ v2.0 i no cap altre. Per aixó,
- pot ser que en el teu compilador, ja siga Watcom, Borland C o qualssevol
- altre, GRAPH no funcione.
- En aquestos casos sería una llastima no poder emprar GRAPH. La solució
- que es podría prendre sería, seguit el exemple de C, modificar el fitxer
- GRFLIB.H (o el corresponent al llenguatge emprat) per a fer-lo compatible
- amb el teu compilador. Aquesta és la raó per la que GRAPH està estructurat
- com ho està.
-
- VERSIO ENSAMBLADOR
-
- GRAPH v2.0 ja no es dedica exclusivament a l'assembler :-( però aquest
- continua sent el llenguatge en el que es programa completament la biblio-
- teca i en el que inicialment es pensa. Per aixó, des de l'ensamblador es
- podrà controlar tot tal i com va ser pensat (també per que l'ensamblador
- és un llenguatge més potent).
- En la versió en assembler ens trobem amb dos possibilitats: la de cri-
- dades "far" i la de cridades "near". Les dos es troben en directoris di-
- ferents i són fàcilment localizables. Una volta hem decidit com cridem a
- les funcions de GRAPH, hem de decidir la forma de les cridades: mitjan-
- çant macros (alternativa 1) o mitjançant CALLs (alternativa 2). Aquestes
- dos formes de comunicació amb GRAPH tenen, com tot, les seves ventajes i
- els seus inconvenients. Amb CALLs alhora de "debuggejar", tot serà més
- clar, però serà un poquet més lent. Al ser menys clar amb macros, jo re-
- comane fer-ho primer amb CALLs i, una volta acabat, passar-ho a macros.
- Per a escollir l'alternativa 1 s'haura de incloure el fitxer GRFLIB.INC
- al fitxer .ASM i per a l'alternativa 2 s'inclourà el fitxer GRFLIB2.INC.
-
- VERSIO C
-
- Encara que no és la primera versió de GRAPH que soporta C (la versió 1.3
- ja el soportava), si és la primera que es troba disponible al públic. GRAPH
- s'aprofita d'aquest llenguatge de mig nivell completament (excepte per dos
- funcions que es troben deshabilitades en el fitxer d'inclusió GRFLIB.H).
- La consideració més important que s'ha de fer es que dins el fitxer ano-
- menat GRFLIB.H hi han dues funcions `PideMEM∩ i `LiberaMEM∩ que són les
- que, internament, GRAPH crida per a demanar memoria. Si no es coneix a la
- perfecció GRAPH, el millor seria deixar-les tal i com són per a no pejar
- el PC.
- Existeixen en C un parell de possibilitats d'ús que es corresponen amb
- el criteri de cridada "far" y el "near". El "far" ens permetrà fer progra-
- mes en el model de memoria "large", mentre el "near" ens ho permetrè en
- el model "compact". La resta de models no poden ser emprats per GRAPH sense
- alguna modificació dels fitxers d'inclusió corresponents.
- Si disposes d'un compilador distint o vols programar amb un altre model
- de memoria, intenta modificar els fitxers d'inclusió i si aconseguises
- fer-lo funcionar correctament enviame'l i seràs col·laborador de GRAPH
- (mira la secció corresponent).
-
- VERSIO PASCAL
-
- GRAPH fa servir en la implementació de Pascal (Turbo Pascal 6.0 per ser
- exactes) tota la potencia de GRAPH a excepció de les dues funcions ya
- esmentades en C que he inhabilitat. Per a incluir GRAPH en els teus pro-
- grames en Pascal hauras de ficar en la clausula "USES" una referència a
- la llibreria que en aquest cas serà `GRFLIB.TPU∩. Aquesta TPU inclou en
- sí mateixa el modul .OBJ que també podràs trobar per separat per si vols
- recompilar la unit de GRAPH.
- En la versió Pascal només et caldrà tenir en compte que no podrás inha-
- bilitar les cridades far (amb la directiva {$F-}) durant el transcurs del
- teu programa. No serà necessaria cap elecció com en el cas del C o l'en-
- samblador. Hauras de tenir present la forma distinta que té Pascal de trac-
- tar les cadenes respecte al C, per el que, al acabar qualsevol cadena
- deuries de col·locar sempre un carácter 0 (amb "+chr(0)").
- El sistema que s'ha seguit per a fer les cridades a GRAPH des del mòdul
- TPU es força interessant, encara que podría resultar un pel complicat de
- modificar. Llig el darrer paràgraf de la versió en C que també serveix per
- al Pascal i l'assembler.$$
- %%209
- CONSIDERACIONES ENTRE LENGUAJES
-
- GRAPH en la nueva versión soporta, además del ensamblador, algunos otros
- lenguajes. Por imposibilidades técnicas y físicas no todos los compiladores
- soportan GRAPH. Así, por ejemplo, en el lenguaje C, GRAPH ha sido diseñada
- para el Turbo C++ v2.0 y no otro. Por eso, puede ser que en tu compilador,
- ya sea Watcom, Borland C o cualquier otro, GRAPH no funcione.
- En estos casos sería una lástima no poder usar GRAPH. La solución que se
- podría tomar sería, siguiendo el ejemplo de C, modificar el fichero GRFLIB.H
- (o el correspondiente al lenguaje empleado) para hacerlo compatible con tu
- compilador. Esta es la razón por la que GRAPH está estructurado como lo
- está.
-
- VERSION ENSAMBLADOR
-
- GRAPH v2.0 ya no se dedica exclusivamente al assembler, pero éste conti-
- nua siendo el lenguaje con el que está programada la biblioteca i en el que
- se piensa inicialmente. Por eso, desde el ensamblador se podrá controlar
- todo tal i como fue pensado.
- En la versión en assembler nos encontramos con dos posibilidades: la de
- llamadas "far" y la de llamadas "near". Una vez hemos decidido como llamar
- a las funciones de GRAPH, tenemos que decidir la forma de las llamadas:
- mediante MACROS (alternativa 1) o mediante CALLs (alternativa 2). Estas 2
- formas de comunicación con GRAPH tienen sus ventajas y sus inconvenientes.
- Con CALLs cuando hay que debuggear, todo será más claro, pero será un poco
- más lento. Yo recomiendo hacerlo primero con CALLs y, una vez acabado, pa-
- sarlo a MACROS. Para escojer la alternativa 1 se tendrá que incluir el fi-
- chero GRFLIB.INC y para la 2 el fichero GRFLIB2.INC.
-
- VERSION C
-
- Aunque no es la primera versión de GRAPH que soporta C (la versión 1.3
- ya lo soportaba), sí es la primera que se encuentra disponible al público.
- GRAPH se aprovecha de este lenguaje de medio nivel completamente (excepto
- por dos funciones que se encuentran deshabilitadas en el fichero de inclu-
- sión GRFLIB.H).
- La consideración más importante que se ha de hacer es que dentro del fi-
- chero llamado GRFLIB.H hay dos funciones `PideMEM∩ y `LiberaMEM∩ que son las
- que, internamente, GRAPH llama para pedir memoria. Si no se conoce a la
- perfección GRAPH, lo mejor seria dejarlas tal y como estan para no colgar
- el PC.
- Existen en C un par de posibilidades de uso que se corresponden con
- el criterio de llamada "far" y el "near". El "far" nos permitirá hacer
- programas en el modelo de memoria "large", mientras el "near" nos lo permi-
- tirá en el modelo "compact". El resto de modelos no pueden ser usados por
- GRAPH sin alguna modificación de los ficheros de inclusión correspondientes.
- Si dispones de un compilador distinto o quieres programar con otro modelo
- de memoria, intenta modificar los ficheros de inclusión y si lo consigues
- hacer funcionar correctamente enviamelo y serás colaborador de GRAPH (mira
- la sección correspondiente).
-
- VERSION PASCAL
-
- GRAPH obtiene en la implementación de Pascal (Turbo Pascal 6.0 para ser
- exactos) toda la potencia de GRAPH a excepción de las dos funciones ya
- comentadas en C que he inhabilitado. Para incluir GRAPH en tus programas
- en Pascal tendrás que poner en la clausula "USES" una referéncia a la libre-
- ria que en este caso será `GRFLIB.TPU∩. Esta TPU incluye en sí misma el
- modulo .OBJ que tambien podrás encontrar por separado por si quieres
- recompilar la unit de GRAPH.
- En la versión Pascal sólo te hará falta tener en cuenta que no podrás
- inhabilitar las llamadas "far" (con la directiva {$F-}) durante el trans-
- curso de tu programa. No será necesaria ninguna elección como en el caso de
- C o el ensamblador. Tendrás que tener presente la forma distinta que tiene
- Pascal de tratar las cadenas respecto al C, por lo que, al acabar cualquier
- cadena deberias de colocar siempre un carácter 0 (con "+chr(0)").
- El sistema que se ha seguido para hacer las llamadas a GRAPH desde el mó-
- dulo TPU es bastante interesante, aunque podría resultar un poco complicado
- de modificar. Lee el último párrafo de la versión C que tambien sirve para
- el Pascal y el assembler.$$
- %%309
- I'm sorry :-( Information not available in english.
- Write me a post card to receive some help. Thank you :-)$$
- %%110
- DOBLAR LES LINIES
-
- De vegades ens caldrà tenir més linies en pantalla de les que tenim i
- ara amb GRAPH podrem fer-ho. Per a començar necessitem estar en un mode
- planar (2 o 3). El que farem será juntar les planes gràfiques 1 i 2 en
- una sola representació. Per consegüent, en el mode 2 ens quedarem en sols
- 2 planes gràfiques i 1.5 (encara que sols podrem veure una) en mode 3.
- Per a fer-ho simplement cridarem a la funció `DoblaLineas∩.
- Sencill veritat? Doncs una volta has entrat, tot el que resta es pot
- fer sense canviar ni una sola linia del teu programa respecte a la versió
- sense doblar linies, es a dir, un `PonPixel∩ "reconeix" el mode en el que
- ens trobem i actua en conseqüencia.
- A voltes ens caldrà tornar al mode anterior (amb les linies sense
- doblar), aleshores simplement haurem de cridar a la funció `ResetGRAPH∩
- i tornarem. De vegades, però, haurem de fer el pas contrari, es a dir,
- en compte de 200 línies voldrem 100 (o de 240 a 120). Per a aquest cas
- prescindirem de GRAPH i farem el que s'explica en el exemple de Pascal.
-
- SCROLL ASSISTIT PER HARDWARE
-
- Aquest truc també és sols per als modes planars i en ell aconseguirem
- un scroll del tipus "gràfic gegant". El hardware de video (de la tarjeta
- VGA es suposa) ens ajudarà a aconseguir-ho.
- Les funcions de GRAPH relacionades són `SetVSPixels∩ i `SetStart∩. Per
- a començar cridarem a `SetVSPixels∩ per a dir-li cuants pixels formen una
- línia interna. Aquest concepte de línia interna tal volta et resulte un
- poc confús però, en realitat, és molt simple. Es tracta de que el hardware
- de la VGA el que fa és tenir virtualment una gran image composada per les
- 4 (o 3) planes gràfiques existents i el que fa en tot moment és mostrar
- un tros d'aquest gran gràfic. Imaginem, per exemple, que aquest cuadre es
- es tota la memoria VRAM. En cada moment nosaltres
- ┌─────────┬─────────┐ sols podem visualitzar una de les cuatre parts
- │ 1 │ 2 │ (cada plana gràfica). La VGA ens permet canviar
- │ │ │ l'inici on comença la plana gràfica (amb la funció
- ├─────────┼─────────┤ `SetStart∩) i així serà com ens mourem. Però abans
- │ 3 │ 4 │ haurem d'escollir el tipus de ordenació que volem.
- │ │ │ En l'exemple de l'esquerra, s'ha "ordenat" a la VGA
- └─────────┴─────────┘ que col·loque 640 pixels per línea. Tenint en
- compte que açó és un mode planar hem de dividir
- entre 4 aquesta cifra i el resultat és 160. I ja està es crida a la funció
- amb la cifra aquesta dividida entre 2 (es a dir, amb un 80).
- A partir del exposat ahí dalt podem deduir que per a col·locar les planes
- una damunt de l'altra (per a scrolls verticals) hem de passar el nombre 40
- i per a col·locar-les una al costat de l'altra (scroll horizontal) hem de
- passar-li un 160.
- El següent pas és fer l'scroll. Per uns raonaments anàlegs, podem deduir
- les "complicadísimes" fórmules de moviment en l'scroll:
-
- SCROLL_dreta --> Direcció_inici = Direcció_inici + 1
- SCROLL_esquerra --> Direcció_inici = Direcció_inici - 1
- SCROLL_avall --> Direcció_inici = Direcció_inici + Long_linia
- SCROLL_amunt --> Direcció_inici = Direcció_inici - Long_linia
-
- La direcció d'inici haurà de ser el programa principal el que la guarde i
- haurà d'inicialitzar-la el mateix programa (amb la funció `SetStart∩).
-
- SCROLL ASSISTIT PER BALDOSES
-
- El conjunt de funcions enmarcades per la designació de funcions de blocs
- son les relacionades amb aquest tipus d'scroll (per baldoses o per blocs).
- Mira bé que significa cada funció i fes proves amb elles. Les utilitats
- adicionals t'ajudarán a crear blocs i mapes d'aquestos blocs. Molt jocs
- empren aquest tipus d'scroll. Alguns exemples són tots els de plataformes,
- els tipus Civilization (per cert, que joc més bo!), etc.$$
- %%210
- DOBLAR LAS LINEAS
-
- A veces nos hará falta tener más líneas en pantalla de las que tenemos y
- ahora con GRAPH podremos conseguirlas. Para empezar necesitamos estar en
- un modo planar (2 o 3). Lo que haremos será unir las páginas gráficas 1 y 2
- en una sola. Por consiguiente, en el modo 2 nos quedaremos con sólo 2 pági-
- nas y en el modo 3 con 1.5 (aunque sólo podamos ver 1). Para hacerlo sim-
- plemente llamaremos a la función `DoblaLineas∩.
- Sencillo verdad? Pues una vez has entrado, todo lo que resta se puede
- hacer sin cambiar ni una sola línea de teu programa respecto a la versión
- sin doblar líneas, es decir, un `PonPixel∩ "reconoce" el modo en el que
- nos encontramos y actua en conseqüencia.
- A veces nos hará falta volver al modo anterior (con las líneas sin
- doblar), entonces simplemente tendremos que llamar a la función `ResetGRAPH∩
- y volveremos. Pero a veces tendremos que hacer el paso contrario, es decir,
- en lugar de 200 líneas querremos 100 (o de 240 a 120). Para este caso pres-
- cindiremos de GRAPH y haremos lo que se explica en el ejemplo de Pascal.
-
- SCROLL ASISTIDO POR HARDWARE
-
- Este truco tambien es solo para los modos planares y en él conseguiremos
- un scroll del tipo "gráfic gigante". El hardware de video (de la tarjeta
- VGA se supone) nos ayudará a aconseguirlo.
- Las funciones de GRAPH relacionadas son `SetVSPixels∩ y `SetStart∩. Para
- empezar llamaremos a `SetVSPixels∩ para decirle cuantos pixels forman una
- línea interna. Este concepto de línea interna tal vez te resulte un poco
- confuso pero, en realidad, es muy simple. Se trata de que el hardware de la
- VGA lo que hace es tener virtualmente una gran imagen compuesta por las
- 4 (o 3) páginas gráficas existentes y lo que hace en todo momento es mostrar
- un trozo de este gran gráfico. Imaginemos, por ejemplo, que este cuadro
- es toda la memoria VRAM. En cada momento nosaltros
- ┌─────────┬─────────┐ solo podemos visualizar una de las cuatro partes
- │ 1 │ 2 │ (cada página gráfica). La VGA nos permite cambiar
- │ │ │ el inicio donde comienza la página gráfica (con la
- ├─────────┼─────────┤ función `SetStart∩) y así será como nos moveremos.
- │ 3 │ 4 │ Pero antes tendremos que escoger el tipo de ordena-
- │ │ │ ción que queremos. En el ejemplo de la izquierda, se
- └─────────┴─────────┘ ha ordenado a la VGA que coloque 640 pixels por
- línea. Teniendo en cuenta que esto es un modo planar
- tenemos que dividir entre 4 esta cifra y el resultado es 160. Y ya está, se
- llama a la función con la cifra ésta dividida entre 2 (es decir, con un 80).
- A partir de lo expuesto ahí arriba podemos deducir que para colocar las
- páginas una encima de otra (para scrolls verticales) tenemos que pasar el
- número 40 y para colocarlas una al lado de la otra (scroll horizontal) hemos
- de pasarle un 160.
- El siguiente paso es hacer el scroll. Por unos razonamientos análogos,
- podemos deducir las "complicadísimas" fórmulas de movimento en el scroll:
-
- SCROLL_derecha --> Dirección_inicio = Dirección_inicio + 1
- SCROLL_izquierda --> Dirección_inicio = Dirección_inicio - 1
- SCROLL_abajo --> Dirección_inicio = Dirección_inicio + Long_linea
- SCROLL_arriba --> Dirección_inicio = Dirección_inicio - Long_linea
-
- La dirección de inicio tendrá que ser el programa principal el que la guarde
- y tendrá que inicializarla el mismo programa (con la función `SetStart∩).
-
- SCROLL ASISTIDO POR BALDOSAS
-
- El conjunto de funciones enmarcadas por la designación de funciones de
- bloques son las relacionadas con este tipo de scroll (por baldosas o por
- bloques). Mira bién que significa cada función y haz pruebas con ellas. Las
- utilitades adicionales te ayudarán a crear bloques y mapas de estos bloques.
- Muchos juegos utilizan este tipo de scroll. Algunos ejemplos son todos los
- de plataformas, los de tipo Civilization (por cierto,¡que juego más bueno!),
- etc.$$
- %%310
- I'm sorry :-( Information not available in english.
- Write me a post card to receive some help. Thank you :-)$$
- %%111
- ELS MODULS
-
- Els móduls són unes biblioteques d'ampliacions de funcions o de substi-
- tució per altres més poderoses o més rápides. Així, la informació que al
- programador-usuari interesa és simplement saber que existeixen ja que,
- alhora d'emprar-les, podrà saber tot el que li interesa mitjançant el DOC
- que incorporarà aquesta llibreria.
- Qui vulga fer moduls distribuibles per a GRAPH que mire la secció sobre
- col·laboradors i, per suposat, que continue llegint. Anem a veure, els
- móduls de GRAPH poden dividir-se en 2 tipus els de ampliació i els de
- actualització. Els d'actualització són aquells que permeten canviar alguna
- funció de GRAPH i els d'ampliació són els que augmenten el nombre de fun-
- cions (també poden donar-se móduls mixtes). Els móduls més complicades de
- programar són les del tipus d'ampliació ja que serà necessari coneixer
- molt bé i internament GRAPH i per aixó si t'animes a programar un módul
- així el millor és que m'escrigues una carta contant-me la teua idea i jo
- et proporcionaré tota la informació que et faça falta.
- Per a programar un módul haurás de tenir present la filosofia de GRAPH
- i respetar-la. També haurás de matindré el módul gratuit a tots els
- usuaris registrats anteriorment a la publicació del teu módul.$$
- %%211
- LOS MODULOS
-
- Los módulos son unas bibliotecas de ampliación de funciones o de subs-
- titución por otras más poderosas o más rápidas. Así, la información que al
- programador-usuario le interesa es simplemente saber que le existen ya que,
- cuando vaya a usarlas, podrá saber todo lo que le interesa mediante el DOC
- que incorporará esta libreria.
- Quien hacer modulos distribuibles para GRAPH que mire la sección sobre
- colaboradores y, por supuesto, que continue leyendo ésta. Vamos a ver, los
- módulos de GRAPH pueden dividirse en 2 tipos los de ampliación y los de
- actualización. Los de actualización son aquellos que permiten cambiar alguna
- función de GRAPH y los de ampliación son los que aumentan el número de fun-
- ciones (tambien pueden darse módulos mixtos). Los módulos más complicados
- de programar son los del tipo de ampliación ya que será necesario conocer
- muy bien e internamente GRAPH y por eso, si te animas a programar un módulo
- así, lo mejor es que me escribas una carta contandome tu idea y yo te pro-
- porcionaré toda la información que te haga falta.
- Para programar un módulo tendrás que tener presente la filosofía de GRAPH
- y respetarla. Tambien tendrás que matener el módulo gratuito a todos los
- usuarios registrados anteriorment a la publicación de tu módulo.$$
- %%311
- I'm sorry :-( Information not available in english.
- Write me a post card to receive some help. Thank you :-)$$
- %%112
- COL·LABORADORS
-
- Tothom pot ser col·laborador de GRAPH, sols és necessari estar registrat
- i voler millorar alguna coseta de GRAPH. No sols és necessari fer col·labo-
- racions relacionades amb la programació, es pot col·laborar de moltes mane-
- res, tantes com se t'ocurreixen.
- La forma més immediata de col·laborar és crear un módul (llig la secció
- corresponent) o programant una utilitat adicional per a automatitzar alguna
- feina. Altra forma de col·laborar programant és millorant els programes
- que van acompanyant a GRAPH (i que tenen les seues fonts).
- Però tal volta vols col·laborar sense tocar l'ensamblador ni els compila-
- dors. En aquest cas pots col·laborar, per exemple, traduint GRAPH a la teua
- llengua (i jo t'enviaria els fonts d'aquest "Help"), donant sugerencies o
- simplement distribuint-lo per la teua ciutat o en la teua BBS local.
- Però no has de limitar-te a aquestes maneres de col·laborar, pots inven-
- tar-te d'altres noves. De totes maneres, si et decideixes a col·laborar,
- tin en compte que has de estar registrat i has de mantenir als usuaris
- registrats que hi haveren fins aleshores.$$
- %%212
- COLABORADORES
-
- Todos pueden ser colaboradores de GRAPH, solo es necesario estar regis-
- trado y querer mejorar alguna cosita de GRAPH. No solo es necesario hacer
- colaboraciones relacionadas con la programación, se puede colaborar de
- muchas maneras, tantas como se te ocurran.
- La forma más inmediata de colaborar es crear un módulo (lee la sección
- correspondiente) o programado una utilidad adicional para automatizar alguna
- tarea. Otra forma de colaborar programando es mejorando los programas que
- van acompañando a GRAPH (y que tienen sus códigos fuentes).
- Pero tal vez quieres colaborar sin tocar el ensamblador ni los compila-
- dores. En este caso puedes colaborar, por ejemplo, traduciendo GRAPH a tu
- lengua (y yo te enviaria los códigos fuentes de este "Help"), dando suge-
- réncias o simplemente distribuyendolo por tu ciudad o en tu BBS local.
- Pero no has de limitarte a estas maneres de colaborar, puedes inventarte
- otras nuevas. De todas formas, si te decides a colaborar, ten en cuenta que
- has de estar registrado y has de mantener a los usuarios registrados que
- hayan hasta entonces.$$
- %%312
- I'm sorry :-( Information not available in english.
- Write me a post card to receive some help. Thank you :-)$$
- %%113
- SUBSCRIPCIONS I REGISTRES
-
- Legalment no vas a ser perseguit per emprar GRAPH sense estar registrat,
- però sí moralment :-) Per que tal volta, un día, GRAPH es faça shareware i
- siga necessari estar registrat per a poder beneficiar-se de les seues ven-
- tajes, aleshores pensaràs "Com he estat tan tonto de no subscriurem?".
- Les ventajes dels usuaris registrats són realment grans, com per exemple:
-
- - Tenir dret a que totes les versions posteriors de GRAPH li surten gràtis.
- - Tenir dret a fer preguntes.
- - Poder ser col·laborador.
- - Tenir informació de cuan surten noves versions i móduls.
- - Poder tenir gràtis els nous móduls que es creen.
- - Poder ser subscriptor.
- - Etc.
-
- Com podrás veure hi ha més d'una raó per a ser usuari registrat i tot pel
- preu d'una postal i un segell.
- D'altra banda, el subscriptor és un usuari registrat normal que cada
- volta que surt una nova versió de GRAPH o un nou módul se li envia aquesta
- versió o aquest módul (en la carta de subscripció es pot especificar si
- es vol o no que se envien els móduls o les noves versions). Simplement el
- que s'ha de fer és enviar-me la postal per a registrar-se i després una
- carta on em diga que vol ser subscriptor (per aquesta vegada acceptaré que
- s'envie la postal dins de la carta). Dins del sobre s'haura d'incloure una
- determinada cuantitat de diskettes. Aquesta cuantitat serà la de noves ver-
- sions que ens subscriurem més una i aquestos diskettes hauran de estar
- plens de coses interesants (mirar el cuadre per a veure sugerències). Si,
- per exemple, ens volem subscriure per a les pròximes 4 versions de GRAPH,
- però no a les versions intermitjes (o siga a les versions 3.0, 4.0, 5.0 i
- 6.0), enviarem una carta especificant que no volem les versions intermitjes
- ni els móduls i enviarem també 5 diskettes (4 per a enviar les versions de
- GRAPH i un per a gastos de lliurament).
-
- ┌─────────────[ Sugerencies de contingut ]───────────────┐
- │ │
- │ æ Diskettes plens de virus informàtics o informació │
- │ sobre ells. │
- │ æ Les fonts d'algun(s) joc(s) o demo(s) interesant(s).│
- │ æ Un compilador de LISP en DOS u OS/2. │
- │ æ Un compilador de ADA 95 més rápid que el de GNU. │
- │ æ Arxius del tipus FAQs o TXT que expliquen coses │
- │ interesants sobre programació. │
- │ æ Un ensamblador en DOS compatible amb el TASM i el │
- │ MASM que soporte multiples passades. │
- │ æ Llibres o revistes electróniques. │
- │ │
- └────────────────────────────────────────────────────────┘$$
- %%213
- SUBSCRIPCIONES Y REGISTROS
-
- Legalmente no vas a ser perseguido por usar GRAPH sin estar registrado,
- pero sí moralment :-) Porque tal vez, un día, GRAPH se haga shareware y sea
- necesario estar registrado para poder beneficiarse de sus ventajas, entonces
- pensarás "Como he estado tan tonto de no subscribirme?".
- Las ventajas de los usuarios registrados son realmente grandes, como por
- ejemplo:
-
- - Tener derecho a que todas las versiones posteriores de GRAPH le salgan
- grátis.
- - Tener derecho a hacer preguntas sobre GRAPH.
- - Poder ser colaborador.
- - Tener información de cuando salen nuevas versiones y modulos.
- - Poder tener grátis los nuevos módulos que se creen.
- - Poder ser subscriptor.
- - Etc.
-
- Como podrás ver hay más de una razón para ser usuario registrado y todo por
- el precio de una postal y un sello.
- Por otro lugar, el subscriptor es un usuario registrado normal que cada
- vez que sale una nueva versión de GRAPH o un nuevo módulo se le envia esta
- versión o este módulo (en la carta de subscripción se puede especificar si
- se quiere o no que se envien los módulos o las nuevas versiones). Simple-
- mente lo que se ha de hacer es enviarme la postal para registrarse y despues
- una carta donde me diga que quiere ser subscriptor (por esta vez aceptaré
- que se envie la postal dentro de la carta). Dentro del sobre se tendrá que
- incluir una determinada cantidad de diskettes. Esta cantidad será la de
- nuevas versiones a las que nos subscribiremos más una y estos diskettes
- tendrán que estar llenos de cosas interesantes (mirar el cuadro para ver
- sugeréncias). Si, por ejemplo, nos queremos subscribir para las próximas 4
- versiones de GRAPH, pero no a les versiones intermedias (o sea a las ver-
- siones 3.0, 4.0, 5.0 i 6.0), enviaremos una carta especificando que no
- queremos las versions intermedias ni los módulos y enviaremos tambien 5
- diskettes (4 para enviar les versiones de GRAPH y uno para gastos de envio).
-
- ┌─────────────[ Sugeréncias de contenido ]───────────────┐
- │ │
- │ æ Diskettes llenos de virus informáticos o información│
- │ sobre ellos. │
- │ æ Los códigos fuente de algun(os) juego(s) o demo(s) │
- │ interesante(s). │
- │ æ Un compilador de LISP en DOS u OS/2. │
- │ æ Un compilador de ADA 95 más rápido que el de GNU. │
- │ æ Archivos del tipo FAQs o TXT que expliquen cosas │
- │ interesantes sobre programación. │
- │ æ Un ensamblador en DOS compatible con el TASM y el │
- │ MASM que soporte multiples pasadas. │
- │ æ Libros o revistas electrónicas. │
- │ │
- └────────────────────────────────────────────────────────┘$$
- %%313
- I'm sorry :-( Information not all available in english.
- Write me a post card to receive more help. Thank you :-)
-
- To be a registered user, you have to send me a post card.
- GRAPH is card-ware and this is a full version. If you want to
- receive in your house all versions of GRAPH, send me the post
- card and explain me it. Try to read the spanish or the català
- version.$$
- %%114
- PREGUNTES I RESPOSTES SOBRE GRAPH
-
- P: Cada cuan surt una nova versió de GRAPH?
- R: Les noves versions i sub-versions de GRAPH no tenen una data de surtida,
- surten cuan estan llestes per a surtir. Aproximadament es podría dir que
- surt una nova versió cada any i les sub-versions, normalment, la x.1 i la
- x.2, que són versions corregides de la x.0, solen surtir 1 mes o 2 més
- tard.
-
- P: La versió 2.0 serà shareware?
- R: Evidentment t'hauras adonat de que NO, però podrien ser-ho versions
- posteriors.
-
- P: Perque GRAPH sols és per a programadors en assembler?
- R: En el moment en que programí la primera versió de GRAPH (i ara tambè) el
- llenguatge de programació que més m'agradava i més potencia era capaç de
- donar-me era l'ensamblador. Per aixó, jo sempre programava en assembler
- i m'oblidí un poc dels usuaris potencials que no coneixen aquest llen-
- guatge. Encara que sí que va existir una versió de GRAPH per a C abans
- de la versió 2.0
-
- P: On es poden aconseguir noves versions?
- R: Al mateix lloc d'on has pillat aquesta o subscribinte.
-
- P: Programes GRAPH tú sol?
- R: Sí, per ara no he rebut cap ajuda. Per aixó GRAPH no té dates de surtida,
- no sé si tindre temps per a programar una nova funció ara o si haure
- d'esperar-me una semana per a fer-ho. Ara pot canviar açó per que he
- donat l'oportunitat a tots els usuaris registrats de ser col·laboradors.
-
- P: Per a qué serveix la postal que demanes per registrar-se?
- R: Doncs és un forma de pagament simbòlic que a més a més es gratificant
- (de vegades) per a la vista.$$
- %%214
- PREGUNTAS Y RESPUESTAS SOBRE GRAPH
-
- P: ¿Cada cuanto sale una nueva versión de GRAPH?
- R: Les nuevas versiones y sub-versiones de GRAPH no tienen una fecha de
- salida, salen cuando estan listas para salir. Aproximadamente se podría
- decir que sale una nueva versión cada año y las sub-versiones, normal-
- mente, la x.1 y la x.2, que son versiones corregidas de la x.0, suelen
- salir 1 mes o 2 más tarde.
-
- P: ¿La versión 2.0 será shareware?
- R: Evidentmente te habras dado cuenta de que NO, pero podrian serlo versiones
- posteriores.
-
- P: ¿Porqué GRAPH solo es para programadores en assembler?
- R: En el momento en que programé la primera versión de GRAPH (y ahora tam-
- bien) el lenguaje de programación que más me gustaba y más potencia era
- capaz de darme era el ensamblador. Por eso, yo siempre programo en assem-
- bler y me olvidé un poco de los usuarios potenciales que no conocen este
- lenguaje. Aunque sí que existio una versión de GRAPH para C antes de la
- versión 2.0
-
- P: ¿Donde se pueden conseguir nuevas versiones?
- R: En el mismo sítio de donde has pillado esta o subscribiendote.
-
- P: ¿Programas GRAPH tu solo?
- R: Sí, por ahora no he recibido ninguna ayuda. Por eso GRAPH no tiene fechas
- de salida, no sé si tendre tiempo para programar una nueva función ahora
- o si tendre que esperarme una semana para hacerlo. Ahora puede cambiar
- esto porque he dado la oportunidad a todos los usuarios registrados de
- ser colaboradores.
-
- P: Para que sirve la postal que pides para registrarse?
- R: Pues es una forma de pago simbólico que a además es gratificante (a veces)
- para la vista.$$
- %%314
- I'm sorry :-( Information not available in english.
- Write me a post card to receive some help. Thank you :-)$$
- %%115
- PROGRAMACIO PRACTICA AMB GRAPH
-
- A continuació es presenta un exemple complet de programació amb GRAPH
- en cadascun del llenguatges que soporta GRAPH.
-
- PROGRAMACIO EN ASSEMBLER
-
- La programació en assembler, el llenguatge més potent dels existents, és
- un poc més dificil. La dificultat està, però, compensada i gràcies a aquest
- llenguatge aconseguirás fites inimaginables en el que respecta a velocitat
- i compactació. Al ser el llenguatge nadiu de GRAPH, l'acoplament és el més
- perfecte.
- Anem a fer un petit exemple de programació en assembler que consistirà en
- un scroll de text sense emprar el hardware (no molt recomanable cuan tingam
- la possibilitat d'ajudar-se del hardware). El primer serà escollir la forma
- i el tipus de cridades que farem a GRAPH. He escollit el model "near" i les
- macros perque es tracta d'un projecte petit i en el que necessitem la velo-
- citat màxima, respectivament.
- Primer haurem de col·locar tot aixó dels segments de dades i code, per a
- simplificar escolliré els que ens dóna el TASM per defecte:
-
- .MODEL SMALL
- .STACK
- .386
-
- .DATA
- PVirt1 DB 0
- hFont DB 0
- Msg1 DB 'Esto es una prueba de scroll',0
-
- .CODE
-
- He col·locat unes dades en el segment corresponent que són respectivament
- per a un handle de PV (pantalla virtual), un handle de font i el mensatge
- de l'scroll.
- Seguidament col·locarem la capçalera que ens permet cridar a GRAPH des
- d'assembler i el procediment principal (i únic):
-
- INCLUDE GRFLIB.INC
-
- Inicio PROC
-
- Dins d'aquest procediment col·locarem, primerament, una cridada per a
- liberar la memoria ocupada i l'inicialització de GRAPH i les dades del
- programa:
-
- CALL LiberaMEM ; Se libera la memoria.
- MOV BX, 1
- MOV EAX, 010b
- InicGRAPH ; Encendemos GRAPH.
- MOV AX, @DATA
- MOV DS, AX
-
- Una volta fet açó ja podem cridar a qualssevol funció de GRAPH, ja estan
- totes disponibles. El següent per a fer el nostre scroll serà demanar una
- PV i inicialitzar el sub-sistema de fonts (demanant al DOS que ens deixe
- prestades les seues fonts):
-
- CreaVirtual ; Pedimos una PV.
- MOV [PVirt1], AL
- MOV AL, 8
- CambiaTipo ; Cambiamos el tipo de fuente.
- CogeFuenteDOS ; Cogemos las fuentes del DOS.
- MOV [hFont], AL
-
- Una volta fet açó nomes ens queda fer l'scroll propiament dit:
-
- MOV DX, 205
- @@Bucle:
- PUSH DX
- MOV BX, 40
- SetCursor ; Colocamos el cursor.
- MOV AL, [PVirt1]
- MOV CL, 0
- BorraPantalla
- MOV BH, DL
- MOV SI, Offset Msg1
- MOV BL, [PVirt1]
- MOV AL, [hFont]
- MOV CL, 9
- MOV DL, 10
- Escribe ; Escribimos
- WaitVR
- MOV AL, [PVirt1]
- MOV AH, 0 ; La VGA
- CopiaPantalla ; Dibujamos en la VGA.
- POP DX
- DEC DX
- JNZ @@Bucle ; Volvemos a repetir hasta 0.
-
- El primer que es fa és col·locar en DX el valor 205 que després es col·loca
- en la pila. Aquest valor ens indicarà la fila on es troba el text al que li
- estem fent l'scroll i ens servirà en la primera cridada a GRAPH per a dir
- on volem que es col·loque el cursor gràfic. Després plenarem amb el valor 0
- que es suposa que és negre la pantalla virtual que haviem demanat per a no
- deixar una estela al pasar el text per pantalla (proba de llevar la cridada
- a `BorraPantalla∩). El següent és escriure a pantalla el text i esperar a
- un retrazat vertical. Amb aquest retrazat (¡que mal sona!) evitem el efecte
- desagradable que pot apareixer. Darrerament copiem a la VGA i fem les opor-
- tunes comprobacions per veure si ja s'acabat l'scroll. Les línies següents
- s'encarreguen de finalitzar GRAPH i tornar al DOS:
-
- VaciaMEM
- EndGRAPH
- MOV AX, 4C00h
- INT 21h ; Salimos al DOS.
- Inicio ENDP
- END Inicio
-
- Com podràs veure, pot resultar molt sencill programar amb GRAPH i per si
- encara vols més exemples, mira't l'altre exemple de programació amb GRAPH
- i recorda que per a compilar sols has d'escriure:
-
- TASM mydemo.asm
- TLINK mydemo.obj graph.lib
-
-
- PROGRAMACIO EN LLENGUATGE C
-
- El exemple de C et demostrarà la potencia dels scrolls per baldoses. He
- escollit el model "far" així que haurás de compilar l'exemple en el model
- "large". En l'exemple obrirem uns fitxers de blocs i mapes i els visua-
- litzarem movent-nos aleatoriament per la pantalla fins a presionar una
- tecla. Primer es troben els fitxers d'inclusió entre els que està el de
- GRAPH en C:
-
- #include <stdlib.h>
- #include <conio.h>
- #include "GRFLIB.H"
-
- int main(void)
- {
-
- Seguim inicialitzant les variables i el sistema GRAPH. Les variables que
- necessitem són les de handles de PV, mapa i blocs i les que guarden les
- coordenades de pantalla i els increments.
-
- byte hdlpv, hmap, hblk;
- int num, ix, iy;
- dword coorx,coory;
-
- InicGRAPH(1,0);
- TrataError();
- hdlpv=CreaVirtual();
- TrataError();
- hmap=CargaMapa("ejemplo.map");
- TrataError();
- hblk=CargaBloque("ejemplo.blk");
- TrataError();
- coorx=coory=0;
-
- Continuem amb un bucle "while" on es comproba si s'ha presionat una tecla
- i s'inicialitzen els increments:
-
- while(!kbhit())
- {
- num=random(100);
- ix=random(3)-1;
- iy=random(3)-1;
-
- Després hi ha un altre bucle "while" que ens servirà per a incrementar les
- posicions (comprobant que no ens passem massa) i dibuixar en la PV que
- haviem demanat el mapa de blocs. I a la fi copiem a la VGA el mapa que
- haviem creat internament.
-
- while(--num>0)
- {
- coorx+=ix;
- coory+=iy;
- if(coorx>10000) coorx=0;
- if(coory>10000) coory=0;
- DibujaMapa(hdlpv,hmap,hblk,coorx,coory);
- CopiaPantalla(hdlpv,0);
- }
- }
-
- Finalitzem GRAPH i tornem al DOS amb les següents línies:
-
- VaciaMEM();
- EndGRAPH();
- return 0;
- }
-
- És molt sencill programar en C amb GRAPH. Si vols veure més exemples en C
- t'hauras d'esperar a la pròxima versió o fer-los tu mateix (a programar en
- GRAPH sols s'apren programant ;-)
-
- PROGRAMACIO EN PASCAL
-
- L'exemple de Pascal ens mostrarà una rutina que és el principi de molts
- efectes de demos com el foc fractal, el blur, etc. També podrem veure amb
- aquest exemple un truc per a dividir les línies en pantalla.
- Per a començar ampliarem la memoria de pila fins al màxim i indicarem a
- Pascal que emprarem GRAPH mitjançant la TPU anomenada "grflib.tpu":
-
- {$M 64000,0,655360}
- PROGRAM ProbaDeGRAPHiPascal;
-
- USES Crt, grflib;
-
- El següent és la initicialització de les constants i les variables. La
- constant "VGA" la emprarem després per a referir-nos a la pantalla física.
- Les variables de memoria magatzemaran els handles de paleta, font i PV.
- A més a més tenim unes variables auxiliars i un array de missatges i les
- variables que indicarán cuan mostrar un nou missatge i el color d'aquest:
-
- CONST
- VGA = 0;
-
- VAR
- hfont,
- pv1 : Byte;
- i, j, s : Integer;
- Msg : Array [1..10] of String;
- Clock : Integer;
- Col : Byte;
-
- El següent bloc de codi és la inicialització de GRAPH i el truc per a
- dividir les línies en pantalla:
-
- BEGIN
- InicGRAPH(1,0);
- ASM
- MOV dx,3d4h
- MOV al,9
- OUT dx,al
- INC dx
- IN al,dx
- AND al,0e0h
- ADD al,3
- OUT dx,al
- END;
-
- Després apareix la part on es demana la PV i es carrega la paleta de
- colors. Observeu que borrem la VGA i la PV que hem demanat per que podrien
- contenir dades que no desitjem que apareguen. Observa també que cuan carre-
- guem la paleta no guardem el handle. Per tant no podrem lliberar la memoria
- emprada per la paleta fins a que no cridem a `VaciaMEM∩ o acabem el progra-
- ma. Per finalitzar en aquest bloc recorder-te que darrere de cada literal
- cuan programes en PASCAL haurás d'insertar un caracter 0.
-
- pv1:=CreaVirtual;
- BorraPantalla(0, pv1);
- BorraPantalla(0, VGA);
- CambiaTipo(8);
- hfont:=CogeFuenteDOS;
- PonPaleta(CargaPaleta('paleta.col'+chr(0)), 0, 0);
-
- Msg[1] := ' Hola a tots, açó és Pascal + GRAPH'+chr(0);
- Msg[2] := ' Hola a todos, esto es Pascal + GRAPH'+chr(0);
- Msg[3] := ' Hello everyone, this is Pascal + GRAPH'+chr(0);
- Msg[4] := '=========================================='+chr(0);
- Msg[5] := '------------------------------------------'+chr(0);
- Msg[6] := '__________________________________________'+chr(0);
- Msg[7] := '..........................................'+chr(0);
-
- s:=1; clock:=100;
-
- El següent tros de codi és el que correspon amb el bucle principal i que
- es repeteix fins a que es presiona una tecla. Primer es comproba si la va-
- riable 'clock' té un valor el suficientment gran com per a escriure un nou
- missatge en pantalla. Després fem un gran bucle on es modifiquen els valors
- i es fa un bonic efecte en pantalla (i molt millorable). Després es cópia
- a la VGA i ja es torna a repetir tot un altra vegada.
-
- Repeat
- If s>7 Then s:=1;
- If clock>15 Then
- BEGIN
- clock:=0;
- SetCursor(20, 10);
- Escribe(hfont, Msg[s], pv1, $FF, 18, 18);
- Inc(s);
- END;
- For i:=1 To 318 DO
- BEGIN
- For j:=1 To 99 DO
- BEGIN
- col:=(CogePixel(i , j-1, pv1)+
- CogePixel(i-1, j-1, pv1)+
- CogePixel(i+1, j-1, pv1)+
- CogePixel(i , j , pv1)+
- CogePixel(i-1, j , pv1)+
- CogePixel(i+1, j , pv1)) DIV 6;
- PonPixel(i, j, col, VGA);
- END;
- END;
- CopiaPantalla(VGA, pv1);
- Inc(Clock);
- Until KeyPressed;
- EndGRAPH;
- END.
-
- Finalment "apaguem" GRAPH i surtim al DOS. Aquest exemple nomes vol ser
- per a ensenyar a programar amb GRAPH, mai s'ha volgut fer un exemple de
- cualitat ni res d'aixó.$$
- %%215
- PROGRAMACION PRACTICA CON GRAPH
-
- A continuación se presenta un ejemplo completo de programación con GRAPH
- en cada uno de los lenguajes que soporta GRAPH.
-
- PROGRAMACION EN ASSEMBLER
-
- La programación en assembler, el lenguaje más potente de los existentes,
- es un poco más dificil. Pero la dificultad está compensada y grácias a este
- lenguaje conseguirás metas inimaginables en lo que respecta a velocidad y
- compactación. Al ser el lenguaje nativo de GRAPH, el acoplamiento es el más
- perfecto.
- Vamos a hacer un pequeño ejemplo de programación en assembler que consis-
- tirá en un scroll de texto sin usar el hardware (no muy recomendable cuando
- tengamos la posibilidad de ayudarnos del hardware). Lo primero serà elegir
- la forma y el tipo de llamadas que haremos a GRAPH. He elegido el modelo
- "near" y las macros porque se trata de un proyecto pequeño y en el que ne-
- cesitamos la velocidad máxima, respectivament.
- Primero tendremos que colocar todo eso de los segmentos de datos y código.
- Para simplificar escogeré los que nos da el TASM por defecto:
-
- .MODEL SMALL
- .STACK
- .386
-
- .DATA
- PVirt1 DB 0
- hFont DB 0
- Msg1 DB 'Esto es una prueba de scroll',0
-
- .CODE
-
- He colocado unos datos en el segmento correspondiente que son respectiva-
- mente para un handle de PV (pantalla virtual), un handle de fuente y el
- mensaje del scroll.
- Seguidamente colocaremos la cabecera que nos permite llamar a GRAPH desde
- el assembler y el procedimento principal (y único):
-
- INCLUDE GRFLIB.INC
-
- Inicio PROC
-
- Dentro de este procedimento colocaremos, primero, una llamada para liberar
- la memoria ocupada y la inicialización de GRAPH y los datos del programa:
-
- CALL LiberaMEM ; Se libera la memoria.
- MOV BX, 1
- MOV EAX, 010b
- InicGRAPH ; Encendemos GRAPH.
- MOV AX, @DATA
- MOV DS, AX
-
- Una vez hecho esto ya podemos llamar a cualquier función de GRAPH, ya
- estan todas disponibles. Lo siguiente a hacer serà pedir una PV y iniciali-
- zar el sub-sistema de fuentes (pidiendo al DOS que nos deje prestadas sus
- fuentes):
-
- CreaVirtual ; Pedimos una PV.
- MOV [PVirt1], AL
- MOV AL, 8
- CambiaTipo ; Cambiamos el tipo de fuente.
- CogeFuenteDOS ; Cogemos las fuentes del DOS.
- MOV [hFont], AL
-
- Una vez hecho esto nada más nos queda hacer el scroll propiamente dicho:
-
- MOV DX, 205
- @@Bucle:
- PUSH DX
- MOV BX, 40
- SetCursor ; Colocamos el cursor.
- MOV AL, [PVirt1]
- MOV CL, 0
- BorraPantalla
- MOV BH, DL
- MOV SI, Offset Msg1
- MOV BL, [PVirt1]
- MOV AL, [hFont]
- MOV CL, 9
- MOV DL, 10
- Escribe ; Escribimos
- WaitVR
- MOV AL, [PVirt1]
- MOV AH, 0 ; La VGA
- CopiaPantalla ; Dibujamos en la VGA.
- POP DX
- DEC DX
- JNZ @@Bucle ; Volvemos a repetir hasta 0.
-
- Lo primero que se hace es colocar en DX el valos 205 que después se coloca
- en la pila. Este valor nos indicará la fila donde se encuentra el texto al
- que le estemos haciendo el scroll y nos servirá en la primera llamada a
- GRAPH para decir donde queremos que se coloque el cursor gráfico. Despues
- llamaremos a con el valor 0 que se supone que es negro, la PV que haviamos
- pedido para no dejar una estela a nuestro paso. Lo siguiente es escribir en
- pantalla el texto y esperar a un retrazado vertical. Con éste retrazado
- (¡Que mal suena!) evitamos el efecto desagradable que puede aparecer. Por
- último copiamos a la VGA y hacemos las oportunas comprobaciones para ver
- siya se ha acabado el scroll. Las líneas que siguen se encargan de finali-
- zar GRAPH y volver al DOS:
-
- VaciaMEM
- EndGRAPH
- MOV AX, 4C00h
- INT 21h ; Salimos al DOS.
- Inicio ENDP
- END Inicio
-
- Como podrás ver, puede resultar muy sencillo programar con GRAPH y por si
- todavía quieres más ejemplos, mira el otro ejemplo de programación con GRAPH
- y recuerda que para compilar solo tienes que escribir:
-
- TASM mydemo.asm
- TLINK mydemo.obj graph.lib
-
-
- PROGRAMACION EN LENGUAJE C
-
- El ejemplo de C te demostrará la potencia de los scrolls por baldosas. He
- elegido el modelo "far" así que tendrás que compilar el ejemplo en el modelo
- "large". En el ejemplo abriremos unos ficheros de bloques y mapas y los vi-
- sualizaremos moviendonos aleatoriamente por la pantalla hasta presionar una
- tecla. Primero se encuentran los ficheros de inclusión entre los que está
- el de GRAPH en C:
-
- #include <stdlib.h>
- #include <conio.h>
- #include "GRFLIB.H"
-
- int main(void)
- {
-
- Seguimos inicializando las variables y el sistema GRAPH. Las variables que
- necesitamos son las de handles de PV, mapa y bloques y las que guardan las
- coordenadas de pantalla y los incrementos.
-
- byte hdlpv, hmap, hblk;
- int num, ix, iy;
- dword coorx,coory;
-
- InicGRAPH(1,0);
- TrataError();
- hdlpv=CreaVirtual();
- TrataError();
- hmap=CargaMapa("ejemplo.map");
- TrataError();
- hblk=CargaBloque("ejemplo.blk");
- TrataError();
- coorx=coory=0;
-
- Continuamos con un bucle "while" donde se comprueba si se ha presionado
- una tecla y se inicializan los incrementos:
-
- while(!kbhit())
- {
- num=random(100);
- ix=random(3)-1;
- iy=random(3)-1;
-
- Despues hay otro bucle "while" que nos servirá para incrementar las posi-
- ciones (comprobando que no nos pasamos demasiado) y dibujar en la PV que
- habiamos pedido el mapa de bloques. Y al final copiamos a la VGA el mapa
- que habiamos creado internamente.
-
- while(--num>0)
- {
- coorx+=ix;
- coory+=iy;
- if(coorx>10000) coorx=0;
- if(coory>10000) coory=0;
- DibujaMapa(hdlpv,hmap,hblk,coorx,coory);
- CopiaPantalla(hdlpv,0);
- }
- }
-
- Finalizamos GRAPH y volvemos al DOS con las siguientes línias:
-
- VaciaMEM();
- EndGRAPH();
- return 0;
- }
-
- Es muy sencillo programar en C con GRAPH. Si quieres ver más ejemplos en C
- tendrás que esperar a la próxima versión o hacerlos tu mismo (a programar en
- GRAPH solo se aprende programando ;-)
-
- PROGRAMACION EN PASCAL
-
- El ejemplo de Pascal nos mostrará una rutina que es el principio de muchos
- efectos de demos como el fuego fractal, el blur, etc. Tambien podremos ver
- con este ejemplo un truco para dividir las líneas en pantalla.
- Para empezar ampliaremos la memoria de pila hasta el máximo i indicaremos
- al Pascal que utilizaremos GRAPH mediante la TPU llamada "grflib.tpu":
-
- {$M 64000,0,655360}
- PROGRAM ProbaDeGRAPHiPascal;
-
- USES Crt, grflib;
-
- Lo siguiente es la initicialización de las constantes y las variables. La
- constante "VGA" la usaremos despues para referirnos a la pantalla física.
- Las variables de memoria almacenarán los handles de paleta, fuente y PV.
- Además tenemos unas variables auxiliares y un array de mensajes y las
- variables que indicarán cuando mostrar un nuevo mensaje y el color de este:
-
- CONST
- VGA = 0;
-
- VAR
- hfont,
- pv1 : Byte;
- i, j, s : Integer;
- Msg : Array [1..10] of String;
- Clock : Integer;
- Col : Byte;
-
- El siguiente bloque de código es la inicialización de GRAPH y el truco
- para dividir las líneas en pantalla:
-
- BEGIN
- InicGRAPH(1,0);
- ASM
- MOV dx,3d4h
- MOV al,9
- OUT dx,al
- INC dx
- IN al,dx
- AND al,0e0h
- ADD al,3
- OUT dx,al
- END;
-
- Despues aparecen la parte donde se pide la PV y se carga la paleta de
- colores. Observad que borramos la VGA y la PV que hemos pedido porque
- podrian contener datos que no deseamos que aparezcan. Observa tambien que
- cuando cargamos la paleta no guardamos el handle. Por tanto no podremos
- liberar la memoria usada por ésta hasta que no llamemos a `VaciaMEM∩ o sal-
- gamos del programa. Para finalizar éste bloque, recuerda que detrás de cada
- literal cuando programes en PASCAL tendrás que insertar un carácter 0.
-
- pv1:=CreaVirtual;
- BorraPantalla(0, pv1);
- BorraPantalla(0, VGA);
- CambiaTipo(8);
- hfont:=CogeFuenteDOS;
- PonPaleta(CargaPaleta('paleta.col'+chr(0)), 0, 0);
-
- Msg[1] := ' Hola a tots, açó és Pascal + GRAPH'+chr(0);
- Msg[2] := ' Hola a todos, esto es Pascal + GRAPH'+chr(0);
- Msg[3] := ' Hello everyone, this is Pascal + GRAPH'+chr(0);
- Msg[4] := '=========================================='+chr(0);
- Msg[5] := '------------------------------------------'+chr(0);
- Msg[6] := '__________________________________________'+chr(0);
- Msg[7] := '..........................................'+chr(0);
-
- s:=1; clock:=100;
-
- El siguiente trozo de código es el que corresponde con el bucle principal
- y que se repite hasta que se presiona una tecla. Primero se comprueba si la
- variable 'clock' tiene un valor suficientmente grande como para escribir un
- nuevo mensaje en pantalla. Despues hacemos un gran bucle donde se modifican
- los valores y se hace un bonito efecto en pantalla (y muy mejorable).
- Despues se cópia a la VGA y se vuelve a repetir todo otra vez.
-
- Repeat
- If s>7 Then s:=1;
- If clock>15 Then
- BEGIN
- clock:=0;
- SetCursor(20, 10);
- Escribe(hfont, Msg[s], pv1, $FF, 18, 18);
- Inc(s);
- END;
- For i:=1 To 318 DO
- BEGIN
- For j:=1 To 99 DO
- BEGIN
- col:=(CogePixel(i , j-1, pv1)+
- CogePixel(i-1, j-1, pv1)+
- CogePixel(i+1, j-1, pv1)+
- CogePixel(i , j , pv1)+
- CogePixel(i-1, j , pv1)+
- CogePixel(i+1, j , pv1)) DIV 6;
- PonPixel(i, j, col, VGA);
- END;
- END;
- CopiaPantalla(VGA, pv1);
- Inc(Clock);
- Until KeyPressed;
- EndGRAPH;
- END.
-
- Finalmente "apagamos" GRAPH y salimos al DOS. Este ejemplo sólo quiere
- mostrar como programar con GRAPH, nunca se ha pretendido hacer un ejemplo
- de calidad ni nada parecido.$$
- %%315
- I'm sorry :-( Information not available in english.
- Write me a post card to receive some help. Thank you :-)
- Read the examples in the directory DEMOS.$$
-